package com.gdpu.liou.symphonyserver.service;

import com.gdpu.liou.symphonyserver.entity.Song;
import com.gdpu.liou.symphonyserver.entity.respose.Response;
import com.gdpu.liou.symphonyserver.common.utils.PagingUtil;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.util.List;


/**
 * 歌曲service
 * @author liou
 */
public interface SongService {

    /**
     * 添加歌曲
     */
    public boolean insertSong(Song song);


    /**
     * @param consumerId 用户id
     * @param songId    歌曲id
     * @return  添加成功
     */
    boolean insertCollectSong(Integer consumerId, Integer songId);

    /**
     * 删除歌曲
     */
    public boolean deleteSong(Integer id);

    /**
     *修改歌曲
     */
    public void updateSong(HttpServletRequest request);

    /**
     * 查询歌手的所有歌曲：根据歌手id
     */
    public PagingUtil songOfSingerId(Integer singerId, Integer currentPage, String word, Integer pageSize);

    /**
     * 查询歌手的歌曲列表
     *
     * @param singerId 歌手id
     * @return 返回歌手的歌曲列表
     */
    List<Song> selectSongsBySingerId(Integer singerId);

    /**
     * 查询歌曲：根据歌曲id
     */
    Song songOfSongId(Integer songId);


    /**
     * 根据歌手-歌曲模糊查询歌曲
     */
    public List<Song> likeSongSingerByKeyword(String name, Integer limit);

    /**
     * 模糊查询歌曲：根据歌名歌手
     * @param name 关键词
     * @return 返回查询歌曲列表
     */
    public List<Song> likeSongByKeyword(String name);

    /**
     * 查询用户最近播放列表
     */
    List<Song> recentlySongList(Integer consumerId);

    /**
     * 更新用户最近播放歌曲
     */
    boolean replaceRecentlySong(Integer consumerId, Integer songId);


    /**
     * 歌曲播放次数排行榜
     *
     * @param number 请求排名数
     * @param group 分组：默认为零，代表就一组  大于零，每组有group个
     * @return
     */
    Response songRankingList(int number, int group);

    /**
     * 歌曲播放次数排行榜
     * @return 返回随机查询的歌曲列表
     */
    List<Song> randomSong();

    /**
     * 查询Redis缓存的歌曲列表
     * @return 返回缓存中的歌曲列表
     */
    List<Song> randomSongByCache();

    /**
     * 查询用户收藏歌曲列表
     * @param consumerId 用户id
     * @return 返回收藏歌曲列表
     */
    List<Song> selectCollectSong(Long consumerId);


    /**
     * 查询用户收藏歌曲列表id
     * @param consumerId 用户id
     * @return 返回收藏歌曲列表id
     */
    List<Integer> selectCollectSongId(Long consumerId);

    /**
     * 查询歌单的歌曲列表
     *
     * @param playlistId 歌单id
     * @return 返回歌曲的歌单列表
     */
    List<Song> selectSongsOfPlaylist(Long playlistId);

    /**
     * 查询歌曲播放排行
     *
     * @param limit 限制条数
     * @return 返回歌曲播放排行
     */
    List<Song> selectRankingOfSong(Integer limit);

    /**
     * 上传添加音乐的封面和文件
     *
     * @param newSong
     * @param file
     * @param cover
     */
    void uploadFile(HttpServletRequest request, MultipartFile file, MultipartFile pic) throws IOException;

    /**
     * 根据id查询音乐
     * @param id
     * @return
     */
     Song selectSongById(Integer id);

    /**
     * 修改歌曲封面
     * @param id
     * @param pic
     * @return
     */
    boolean updataSongPic(int id, MultipartFile pic) throws IOException;
}
